# 1：list的crud
# list中储存的元素是引用
def lists():
    list_1 = ['1',2,3.0,4>5,6<7,None,bytes("8",encoding="utf-8")]
    list_2 = ['9','10']
    list_3 = [0,True,False,4,1]
    return list_1,list_2,list_3

''' 1.1: create(增)
your_list.append()(在list末尾新增)
+(通过+号拼接两个list,并返回新的list)
+=(list内存地址不变)
*(通过*n,引用n个list里的所有元素,再赋值给list)
*=（。。。）
your_list.insert()(在下标为XX的位置，插入"XX";当下标大于当前列表长度时，则插入到末尾位置)
'''
list_1=lists()[0]
list_2=lists()[1]
print("list_1:",list_1,"->内存地址：",id(list_1))
list_1.append("我是append进来的")
print("list_1.append():",list_1,"->内存地址：",id(list_1))
list_1 = list_1 + list_2
print("list_1+list_2:",list_1,"->内存地址：",id(list_1))
list_1 += list_2
print("list_1+=list_2:",list_1,"->内存地址：",id(list_1))
list_1 = list_1*2
print("list_1*2:",list_1,"-内存地址：",id(list_1))
list_1.insert(0,'我是insert进来的')
print("list_1.insert():",list_1,"-内存地址：",id(list_1))

''' 1.2: retrieve(查)
your_list[x](通过索引取值)
your_list[start:end:step](切片,从下标start开始，到下标end结束，但不包括下标为end的元素，每隔step个元素取一次值)
your_list.index()（通过值获得下标）
'''
list_3 = lists()[0]
print("\nlist_3:",list_3)
print("your_list[x]:",list_3[len(list_3)-1])
print("your_list[start:end:step]:",list_3[0:6:2])
print("index:",list_3.index(2))

''' 1.3:update（改）
your_list[x]=xx(把下标为X的元素值改为xx）

your_list[start:end]='xxx'(切片赋值,xxx必须是可迭代的)(
>>> a=[0,2,4,5,1]
>>> a[0:2]=['111','222','333','444']
>>> a
['111', '222', '333', '444', 4, 5, 1]
'''
list_4 = lists()[0]
print("\nlist_4:",list_4)
list_4[0]=0
print("your_list[x]=xx:",list_4)
list_4[0:1]='我是切片赋值'
print("your_list[start:end]:",list_4)

''' 1.4:delete(删)
your_list.pop()(删除list中最后一个元素，并将它返回）
your_list.clear()(清空list,内存地址不会改变)
'''
list_5=lists()[0]
print("\nlist_5:",list_5)
list_5.pop()
print("your_list.pop():",list_5)
list_5.clear()
print("your_list.clear():",list_5)

''' 1.5:sort(排序)
your_list.__reversed__()和list(reversed(your_list))(将原list倒序排序后，返回一个新的list,原list不变）
your_list.sort()(从小到大排序，必须是同种数据类型才可以进行排序)
your_list.reverse()(从大到小排序）
'''
list_6=lists()[2]
print("\nlist_6:",list_6)
print("list(reversed(your_list)):",list(reversed(list_6)))
list_7=list_6.__reversed__()
print("your_list.__reversed__():",list(list_7),"原list_6:",list_6)
list_6.sort()
print("your_list.sort():",list_6)
list_6.reverse()
print("your_list.reverse():",list_6)

# 2：tuple的crud
#tuple不可改变
# 2.1：create  无

''' 2.2:retrieve
your_tuple[x](索引取值，查询下标为X的元素的值）
your_tuple.index(value)(查询值为value的元素的下标)
your_tuple[start:end:step](切片)
'''
tuple_1=('1',2,3.0,None,False,True,bytes('4',encoding="utf-8"))
print("\ntuple_1:",tuple_1)
print("your_tuple[]:",tuple_1[0])
print("your_tuple.index(value):",tuple_1.index(False))
print(tuple_1[0:3:2])

# 2.3：update  无

# 2.4：delete  无
# 实践发现没有key为True的键值对
# 3：dict的crud
def dicts():
    dict_1={1:-1,'2':'2',3.0:3.0,None:None,True:True,False:False,bytes(4):bytes(4)}
    dict_2={"test_1":"test_1"}
    return dict_1,dict_2

''' 3.1：create
your_dict['xx']='xxx'(键值对赋值,如果已有key（xx），则将值xxx赋值给xx，如果没有就新建'xx'：xxx的键值对）
your_dict_1.update(your_dict_2)(把your_dict_2合并到your_dict_1)
your_dict.setdefault(key,value)(如果当前dict没有key，则设置默认值value)
'''
dict_1=dicts()[0]
dict_2=dicts()[1]
print("\ndict_1:",dict_1)
dict_1['我是键值对赋值加进来的key']='我是键值对赋值加进来的value'
print("your_dict['xx']='xx':",dict_1)
dict_1.update(dict_2)
print("your_dict_1.update(your_dict_2):",dict_1)
dict_1.setdefault('我是your_dict.setdefault(key,value)加进来的key','我是your_dict.setdefault(key,value)加进来的value')
print("your_dict.setdefault(key,value):",dict_1)

''' 3.2:retrieve
your_dict[key](键值对访问，通过key获取value)
your_dict.get(key，xx)(通过key获取value，若key不存在则返回xx）
your_dict.keys()(获取所有的key)
your_dict.values()(获取所有的value)
your_dict.items()(获取所有的item)
'''
dict_3=dicts()[0]
print("\nyour_dict[key]:",dict_3[1])
print("your_dict.get(key):",dict_3.get(1))
print("your_dict.keys():",dict_3.keys())
print("your_dict.values():",dict_3.values())
print("your_dict.items():",dict_3.items())

''' 3.3:update
your_dict[key]=new_value(通过键值对赋值改变value）
'''
dict_4=dicts()[0]
dict_4['2']='通过键值对赋值改变value'
print("\nyour_dict[key]=new_value:",dict_4)

''' 3.4:delete
your_dict.pop(key)(删除当前元素并返回value）
your_dict.popitem()(对人类来说，相当于随机删除并返回一个item)
dict_5.clear()(清空所有元素)
'''
dict_5=dicts()[0]
dict_test_1=dict_5.pop(1)
print("\nyour_dict.pop(key):",dict_test_1,dict_5)
dict_test_2=dict_5.popitem()
print("your_dict.popitem():",dict_test_2,dict_5)
dict_5.clear()
print("your_dict.clear():",dict_5)

# 4:set的crud
# set不存在元素True
set_1={1,2.0,'3',None,True,False,bytes(4)}
set_2={'test_1','test_2'}
'''4.1:create
your_set.add(xx)(通过add添加元素xx到集合set)
set_3=set_1.union(set_2)(将set_1和set_2合并成新的集合set_3,原1和2不变)
'''
set_1.add('我是add进来的')
print("\nyour_set.add(xx):",set_1)
set_3=set_1.union(set_2)
print("set_3=set_1.union(set_2):",set_3)

''' 4.2:retrieve
a in your_set()
'''
set_4={1,2.0,'3',None,True,False,bytes(4)}
print("\na in set:",""'2' in set_4)

''' 4.3:update
跟create中union同理
'''

''' 4.4:delete
your_set.remove(x)(删除值为X的元素,当x不存在时会报错)
your_set.discard(x)（删除值为X的元素,当x不存在时不会报错)
your_set.pop()(当成无序删除一个元素并返回此元素的值)
'''
set_5={1,2.0,'3',None,True,False,bytes(4)}
set_5.remove(1)
print("\nyour_set.remove(x):",set_5)
set_5.discard(1000)
print("your_set.discard(x):",set_5)
set_test=set_5.pop()
print("your_set.pop():",set_test,set_5)